/*
    基于tcp和http协议的网络通信服务器
    完整的http协议工作原理：如何将请求和资源（网页、服务等任何东西）联通交互起来
*/

#include <unistd.h>
#include "tcpserver.hpp"
#include "http.hpp"

void useTips(char *command)
{
    std::cout << "useTips:" << command << " port" << std::endl;
}

std::shared_ptr<http_ns::HttpResponse> login(std::shared_ptr<http_ns::HttpRequest>& req)
{
    //先拿到参数
    std::string userdate;
    if(strcasecmp(req->method().c_str(), "get"))
    {
        userdate = req->args();
    }
    else if(strcasecmp(req->method().c_str(), "post"))
    {
        userdate = req->text();
    }
    else
    {
        // 根据不同的方法做相应的处理
        //.......
    }

    /*
        下面三步就是http的工作原理核心，如何将请求和服务联通起来
    */
    // 我们清楚服务器进程只负责接收和发送数据，http协议只负责序列化和反序列化，数据的处理不由我们来做
    // 应该创建新的进程来做：将任务交给它们->进程间通信
    // 1. 建立管道pipe、环境变量、共享内存（让进程看到同一个空间）

    // 2. 创建进程fork

    // 3. exec : exec可以替换任何类型的进程 python、php、java、c++

    // 处理数据（这里简单固定写法处理）
    std::cout << "login:" << userdate << std::endl;
    
    // 返回响应(重定向到起始页)
    std::shared_ptr<http_ns::HttpResponse> res = http_ns::Factory::buildHttpResponse();
    int statuscode = 301;
    std::string statusdesc = "ok";
    res->addStatusLine(statuscode, statusdesc);
    res->addHead("Context-Type", "text/html");
    res->addHead("location", "/");
    std::string text = "<html><h1>handler data done</h1></html>";
    res->addText(text);
    res->printResponse();
    return res;
}

int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        useTips(argv[0]);
        return 0;
    }
    EnableScreen();
    
    // 0、创建http协议服务
    http_ns::HttpServer hp;

    // 0.1 防止路径来进行功能路由
    hp.addBusinessHander("/login", login);
    //hp.addBusinessHander("/register", login);

    // 1、创建服务器（会话层）
    unique_ptr<TcpServer_ns::TcpServer> svr = make_unique<TcpServer_ns::TcpServer>(stoi(argv[1]), std::bind(&http_ns::HttpServer::server, &hp, placeholders::_1));

    // 2、启动服务器
    svr->start();

    return 0;
}